package com.powernode.tool;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.powernode.dao.McpDao;
import jakarta.annotation.Resource;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * MySQL数据库服务类，提供数据库表结构查询和SQL执行功能
 * 用于与大模型交互，提供数据库元数据和查询结果
 */
@Service
public class MysqlService {
    /**
     * 数据库访问对象，用于执行SQL操作
     */
    @Resource
    private McpDao mcpDao;

    /**
     * 获取数据库中所有表名
     * 工具作用：告诉大模型这个方法是获取数据库表名列表的
     *
     * @return 所有表名的逗号分隔字符串，如"table1,table2,table3"
     */
    @Tool(description = "Return all table names in the database separated by comma.")
    public String listAllTableNames() {
        List<String> tableNames = mcpDao.listAllTableNames();
        return String.join(",", tableNames);
    }

    /**
     * 获取指定表的结构信息
     * 包括列名、数据类型和约束条件等信息
     *
     * @param tableName 表名，区分大小写
     * @return 表结构信息的JSON字符串，包含列名、数据类型和约束等
     */
    @Tool(description = "Returns schema and relation information for the given table. Includes column name, data type and constraints. json data")
    public String listAllColumnNames(String tableName) {
        List<Map<String, Object>> columnNames = mcpDao.listAllColumnNames(tableName);
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            // 将表结构信息转换为JSON格式字符串返回
            return objectMapper.writeValueAsString(columnNames);
        } catch (JsonProcessingException e) {
            // JSON序列化失败时打印异常堆栈并返回空字符串
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 执行SELECT SQL查询并返回结果
     * 结果将以Map列表形式返回，键为列名，值为字段值
     * 注意：结果在超过4000字符时会被截断
     *
     * @param sql 要执行的SELECT SQL语句
     * @return 查询结果的Map列表，每条记录为一个Map对象
     */
    @Tool(description = "Execute a select SQL query and return results in a readable format. Results will be truncated after 4000 characters.")
    public List<Map<String, Object>> query(String sql) {
        List<Map<String, Object>> result = mcpDao.query(sql);

        return result;
    }
}
